package com.tensai.study.新概念.响应式编程.reactor.flux;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import reactor.core.publisher.Flux;

import java.time.Duration;
import java.util.concurrent.TimeUnit;


/**
 * <b>Flux中map和flatMap的区别</b>
 * <br />
 * <br />
 * flatMap的转换Function要求返回一个Publisher，<br />
 * 这个Publisher代表一个作用于元素的异步的转换操作；<br />
 * 而map仅仅是同步的元素转换操作。
 *
 * @author Tensai
 */
@Slf4j
public class MapAndFlatMapTest {

    /**
     * 这里头的map是纯元素转换
     */
    @Test
    public void testMap() {
        Flux.just(1, 2, 3, 4)
                .log()
                .map(i -> {
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    return i * 2;
                })
                .subscribe(e -> log.info("get:{}", e));
    }

    /**
     * 这里的flatMap，将元素转为Mono或Flux，转换操作里头还可以进行异步操作
     */
    @Test
    public void testFlatMap() {
        Flux.just(1, 2, 3, 4)
                .log()
                .flatMap(e -> Flux.just(e * 2).delayElements(Duration.ofSeconds(1)))
                .subscribe(e -> log.info("get:{}", e));
    }
}
